问题
当不确定参数个数的时候可以采用可变参数,那么,在使用可变参数时有哪些需要注意的?
解决
可变参数可以被用来接受0个或者多个指定类型的参数。
示例:当方法需要1个或者多个参数的方法时,直接使用可变参数就会变得不优雅:
public static min(int...args){ if(args.length==0){ throw new IllegalrgumentException("Too few arguments!"); } .... }
由于该方法要求参数至少有1个,但是可变参数可以接受的是0个或者多个指定类型的参数,因此需要判断当前的参数args的长度是否为0,最终的结果是将这种检验放到了运行时而不是编译时。针对这种情况,做这样的调整:
public static min(int defaultParam, int...args){ .... }
由于通过方法入参要求了必须传入一个参数defaultParam,因此就少了参数个数的判断,方法变得优雅。
使用可变参数的规律为:方法强制要求的默认参数,在方法入参明确给出,可变参数用于进行兜底不确定参数个数的情况。
遍历数组
采用
Arrays.toString()
方法遍历数组,而不要采用Arrays.toList().toString
去遍历数组,这是因为toList
方法接受的是可变参数,如果想要正确输出数组内容的话,数组里元素必须是对象引用型数据,而不能是基本类型数据。如下例:List<String> homophones = Arrays.asList("to", "too", "two"); System.out.println(homophones); int[] digits = { 1, 2, 3, 4, 5 }; System.out.println(Arrays.asList(digits)); //输出结果为 [to, too, two] [[I@15db9742]
当数组元素为int基本类型数据时,Arrays.asList方法将int类型的数组的引用集中到单个元素数组中,并封装成List
。 使用可变参数的场景
在重视性能的情况下,使用可变参数机制要小心,因为可变参数方法的每次调用都会导致进行一次数组分配和初始化,有一种折中的解决方案,假设确定某个方法大部分调用会有3个或者更少的参数,就声明该方法的5个重载,每个重载带有0至3个普通参数,当参数数目超过3个时,使用可变参数方法。
public void foo() {} public void foo() {int a1} public void foo() {int a1, int a2} public void foo() {int a1, int a2, int a3} public void foo() {int a1, int a2, int a3, int... rest}
结论
总之,和其他规则一样,尽管可变参数是一个很方便的方式,但是它们不应该被过度滥用。除非有必要,尽量不要使用这种方法。